home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
AMIGA
/
AMICUS
/
AMICUS05.ADF
/
IFF
/
putpict.c
< prev
next >
Wrap
C/C++ Source or Header
|
1986-04-20
|
4KB
|
91 lines
/** putpict.c ***************************************************/
/* PutPict(). Given a BitMap and a color map in RAM on the */
/* Amiga, outputs as an ILBM. See /iff/ilbm.h & /iff/ilbmw.c. */
/* 23-Jan-86 */
/* */
/* By Jerry Morrison and Steve Shaw, Electronic Arts. */
/* This software is in the public domain. */
/* */
/* This version for the Commodore-Amiga computer. */
/* */
/****************************************************************/
#include "iff/intuall.h"
#include "iff/gio.h"
#include "iff/ilbm.h"
#include "iff/putpict.h"
#define MaxDepth 5
static IFFP ifferror = 0;
#define CkErr(expression) {if (ifferror == IFF_OKAY) ifferror = (expression);}
/*****************************************************************************/
/* IffErr */
/* */
/* Returns the iff error code and resets it to zero */
/* */
/*****************************************************************************/
IFFP IffErr()
{
IFFP i;
i = ifferror;
ifferror = 0;
return(i);
}
/*****************************************************************************/
/* PutPict() */
/* */
/* Put a picture into an IFF file */
/* Pass in mask == NULL for no mask. */
/* */
/* Buffer should be big enough for one packed scan line */
/* Buffer used as temporary storage to speed-up writing. */
/* A large buffer, say 8KB, is useful for minimizing Write and Seek calls. */
/* (See /iff/gio.h & /iff/gio.c). */
/*****************************************************************************/
BOOL PutPict(file, bm, pageW, pageH, colorMap, buffer, bufsize)
LONG file; struct BitMap *bm;
WORD pageW,pageH;
WORD *colorMap;
BYTE *buffer; LONG bufsize;
{
BitMapHeader bmHdr;
GroupContext fileContext, formContext;
ifferror = InitBMHdr(&bmHdr,
bm,
mskNone,
cmpByteRun1,
0,
pageW,
pageH );
/* use buffered write for speedup, if it is big-enough for both
* PutBODY's buffer and a gio buffer.*/
#define BODY_BUFSIZE 512
if (ifferror == IFF_OKAY && bufsize > 2*BODY_BUFSIZE) {
if (GWriteDeclare(file, buffer+BODY_BUFSIZE, bufsize-BODY_BUFSIZE) < 0)
ifferror = DOS_ERROR;
bufsize = BODY_BUFSIZE;
}
CkErr(OpenWIFF(file, &fileContext, szNotYetKnown) );
CkErr(StartWGroup(&fileContext, FORM, szNotYetKnown, ID_ILBM, &formContext) );
CkErr(PutCk(&formContext, ID_BMHD, sizeof(BitMapHeader), (BYTE *)&bmHdr));
if (colorMap!=NULL)
CkErr( PutCMAP(&formContext, colorMap, (UBYTE)bm->Depth) );
CkErr( PutBODY(&formContext, bm, NULL, &bmHdr, buffer, bufsize) );
CkErr( EndWGroup(&formContext) );
CkErr( CloseWGroup(&fileContext) );
if (GWriteUndeclare(file) < 0 && ifferror == IFF_OKAY)
ifferror = DOS_ERROR;
return( (BOOL)(ifferror != IFF_OKAY) );
}